#include <unistd.h>
#include <iostream>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
using namespace std;

// int main()
// {
//     int fd[2] = {0};
//     if(pipe(fd) < 0)
//     {
//         perror("pipe fail!");
//         return 1;
//     }

//     int id = fork();
//     if(id == 0)
//     {
//         //child;
//         close(fd[0]);
//         //子进程开始写;
//         const char* mess = "hello father, I am child...";
//         int count = 5;
//         while(count--)
//         {
//             write(fd[1], mess, strlen(mess));
//             sleep(1);
//         }
//         close(fd[1]);
//         exit(1);
//     }

//     //father;
//     close(fd[1]);
//     //父进程读
//     // char buff[64];
//     // while(1)
//     // {
//     //     ssize_t s = read(fd[0], buff, sizeof(buff));
//     //     if(s > 0)
//     //     {
//     //         buff[s] = '\0';
//     //         cout << "child send to father:" << buff << endl;
//     //     }
//     //     else if(s == 0)
//     //     {
//     //         cout << "read file end!" << endl;
//     //         break;
//     //     }
//     //     else
//     //     {
//     //         cout << "read fail!" << endl;
//     //         break;
//     //     }
//     // }
//     //父进程直接关闭读端
//     close(fd[0]);
//     int status = 0;
// 	waitpid(id, &status, 0);
// 	printf("child get signal:%d\n", status & 0x7F);
//     return 0;
// }

// int main()
// {
//     int fd[2] = { 0 };
// 	if (pipe(fd) < 0){ //使用pipe创建匿名管道
// 		perror("pipe");
// 		return 1;
// 	}
// 	pid_t id = fork(); //使用fork创建子进程
// 	if (id == 0){
// 		//child
// 		close(fd[0]); //子进程关闭读端
// 		char c = 'a';
// 		int count = 0;
// 		//子进程一直进行写入，一次写入一个字节
// 		while (1){
// 			write(fd[1], &c, 1);
// 			count++;
// 			printf("%d\n", count); //打印当前写入的字节数
// 		}
// 		close(fd[1]);
// 		exit(0);
// 	}
// 	//father
// 	close(fd[1]); //父进程关闭写端

// 	//父进程不进行读取

// 	waitpid(id, NULL, 0);
// 	close(fd[0]);
// 	return 0;
// }

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define FILE_NAME "myfifo"


//server
// int main()
// {
//     umask(0);
//     if (mkfifo(FILE_NAME, 0666) < 0)
//     {
//         perror("fifo error!");
//         return 1;
//     }

//     // code
//     int fd = open(FILE_NAME, O_RDONLY, 0666);
//     if(fd < 0)
//     {
//         perror("server open fail!");
//         return 2;
//     } 

//     char mess[128];
//     while(1)
//     {
//         mess[0] = '\0';
//         ssize_t s = read(fd, mess, sizeof(mess)-1);
//         if(s > 0)
//         {
//             mess[s] = '\0';
//             cout << "clien call# " << mess << endl;
//         }
//         else if(s == 0)
//         {
//             cout << "read end!" << endl;
//             break;
//         }
//         else
//         {
//             cout << "read fail!";
//             break;
//         }
//     }
//     close(fd);
//     return 0;
// }

// //client

// int main()
// {
//     int fd = open(FILE_NAME, O_WRONLY);
//     if(fd < 0)
//     {
//         perror("client open fail!");
//         return 1;
//     }

//     char buff[128];
//     while(1)
//     {
//         buff[0] = '\0';
//         cout << "please enter#" << endl;
//         fflush(stdout);
//         ssize_t s = read(fd, buff, sizeof(buff)-1);
//         if(s > 0)
//         {
//             buff[s-1] = '\0';
//             write(fd, buff, strlen(buff)-1);
//         }
//     }
//     close(fd);
//     return 0;
// }




